#include <QDateTime>
#include <QScrollBar>
#include "ChatWindow.h"
#include "Client.h"
#include "Const.h"
#include "ui_ChatWindow.h"

/**
 * 构造方法。
 * @param friendName    好友名
 * @param parent        父窗口
 */
ChatWindow::ChatWindow(const char* friendName, QWidget* parent) :
    QDialog(parent),
    ui(new Ui::ChatWindow),
    mFriendName(friendName) {
    ui->setupUi(this);

    // 设置窗口标题
    QDialog::setWindowTitle(friendName);
}

/**
 * 析构方法。
 */
ChatWindow::~ChatWindow() {
    delete ui;
}

/**
 * "发送"按钮的单击响应方法。
 */
void ChatWindow::on_buttonSend_clicked() {
    // 获取用户输入的聊天内容
    QString content(ui->editInput->toPlainText());

    // 获取当前时间
    QString time(QDateTime::currentDateTime().toString(Const::DATE_TIME_FORMAT));

    // 显示聊天内容
    ChatInfo chatInfo(content.toStdString().c_str(), mFriendName.toStdString().c_str(), Client::getUsername(), time.toStdString().c_str());
    this->setContent(&chatInfo);

    // 清空聊天内容编辑框
    ui->editInput->clear();

    // 发送聊天内容
    emit UM_CHAT_C2S(&chatInfo);
}

/**
 * 文字改变事件的响应方法。
 */
void ChatWindow::on_editInput_textChanged() {
    // 设置最大输入长度
    QString text = ui->editInput->toPlainText();
    int length = text.count();
    if (length > ImProtocol::MAX_CONTENT_LEN) {
        int position = ui->editInput->textCursor().position();
        QTextCursor textCursor = ui->editInput->textCursor();
        int startPos = position - (length - ImProtocol::MAX_CONTENT_LEN);
        int endPos = length - ImProtocol::MAX_CONTENT_LEN;
        text = text.remove(startPos, endPos);
        ui->editInput->setText(text);
        textCursor.setPosition(startPos);
        ui->editInput->setTextCursor(textCursor);
    }
}

/**
 * 设置聊天内容。
 * @param chatInfo  聊天信息
 */
void ChatWindow::setContent(ChatInfo* chatInfo) {
    // 显示聊天内容
    QString friendName(chatInfo->mSrcUsername);
    QString time(chatInfo->mTime);
    QString content(chatInfo->mContent);
    QString show(friendName + Const::LEFT_BR + time + Const::RIGHT_BR + content + Const::WRAP);
    content = ui->editHistory->toPlainText() + show;
    ui->editHistory->setText(content);

    // 滚动到最底行
    QScrollBar* scrollBar = ui->editHistory->verticalScrollBar();
    scrollBar->setValue(scrollBar->maximum());
}
